/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica.Regras.Declaracoes;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Regra;
import analiseSintatica.estruturadados.NoArvore;
import java.util.LinkedList;

/**
 *
 * @author Edney
 */
public class RegraArray extends Regra {


    RegraAtribuicaoArray atribuicaoarray = RegraAtribuicaoArray.getInstance();
    protected static Regra instancia;
    protected String estrutura = "<array> ::= '['  (  numeroInteiro ']' {'[' numeroInteiro ']'} [<atribuicao_array>]|']' <atribuicao_array> )";

    private RegraArray() {
    }

     public static RegraArray getInstance() {
        if (instancia == null) {
            instancia = new RegraArray();
        }
        return (RegraArray) instancia;
    }

    @Override
    public NoArvore analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {

        ErroSintaticoException erros = new ErroSintaticoException();

        NoArvore naoterminalArray = new NoArvore("<Array>", false);

        naoterminalArray.adicionaFilho(reconheceToken(listaTokens, "[",estrutura));

        try{

            if (listaTokens.getFirst().getToken().equals("numeroInteiro")){

                naoterminalArray.adicionaFilho(reconheceToken(listaTokens, "numeroInteiro",estrutura));
                naoterminalArray.adicionaFilho(reconheceToken(listaTokens, "]",estrutura));

                while(listaTokens.getFirst().getToken().equals("delimitador")){

                    naoterminalArray.adicionaFilho(reconheceToken(listaTokens, "numeroInteiro",estrutura));
                    naoterminalArray.adicionaFilho(reconheceToken(listaTokens, "]",estrutura));

                }

                if(RegraAtribuicaoArray.getInstance().getPrimeiro().contains(listaTokens.getFirst().getToken())){


                     try{

                            naoterminalArray.adicionaFilho(RegraAtribuicaoArray.getInstance().analisar(listaTokens));

                    }
                    catch(ErroSintaticoException e){

                        while(e.size() != 0)
                            erros.addErros(e.getErros());

                    }

                }

            }

            else{

                try{

                    naoterminalArray.adicionaFilho(reconheceToken(listaTokens, "]",estrutura));
                }
                catch(ErroSintaticoException e){

                }

                try{

                            naoterminalArray.adicionaFilho(RegraAtribuicaoArray.getInstance().analisar(listaTokens));

                    }
                    catch(ErroSintaticoException e){

                        while(e.size() != 0)
                            erros.addErros(e.getErros());

                    }
          
            }

        }catch(ErroSintaticoException e){

        }

System.out.println("Terminei Regra Array");
        return naoterminalArray;

    }

    @Override
    protected void setPrimeiro() {
       primeiro.add("[");
    }

    @Override
    protected void setSeguinte() {
        this.seguinte.add("void");
        this.primeiro.add("typedef");
        this.primeiro.add("const");
        this.primeiro.add("identificador");
        this.primeiro.add("char");
        this.primeiro.add("int");
        this.primeiro.add("float");
        this.primeiro.add("boolean");
        this.seguinte.add(",");
    }

}
